package com.cencat.order.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cencat.order.entity.Driver;
import com.cencat.order.vo.DriverVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 司机信息数据访问层接口
 * 
 * @author cencat
 * @date 2024-01-20
 */
@Mapper
public interface DriverMapper extends BaseMapper<Driver> {

    /**
     * 分页查询司机列表
     *
     * @param page 分页参数
     * @param driverName 司机姓名(模糊查询)
     * @param driverPhone 司机手机号(模糊查询)
     * @param driverStatus 司机状态
     * @param certificationStatus 认证状态
     * @param vehicleType 车辆类型
     * @param startTime 创建开始时间
     * @param endTime 创建结束时间
     * @return 司机分页列表
     */
    IPage<DriverVO> selectDriverPage(Page<DriverVO> page,
                                   @Param("driverName") String driverName,
                                   @Param("driverPhone") String driverPhone,
                                   @Param("driverStatus") Integer driverStatus,
                                   @Param("certificationStatus") Integer certificationStatus,
                                   @Param("vehicleType") String vehicleType,
                                   @Param("startTime") LocalDateTime startTime,
                                   @Param("endTime") LocalDateTime endTime);

    /**
     * 根据司机编号查询司机信息
     *
     * @param driverCode 司机编号
     * @return 司机信息
     */
    DriverVO selectByDriverCode(@Param("driverCode") String driverCode);

    /**
     * 根据手机号查询司机信息
     *
     * @param driverPhone 司机手机号
     * @return 司机信息
     */
    Driver selectByDriverPhone(@Param("driverPhone") String driverPhone);

    /**
     * 根据身份证号查询司机信息
     *
     * @param idCardNumber 身份证号
     * @return 司机信息
     */
    Driver selectByIdCardNumber(@Param("idCardNumber") String idCardNumber);

    /**
     * 根据驾驶证号查询司机信息
     *
     * @param drivingLicenseNumber 驾驶证号
     * @return 司机信息
     */
    Driver selectByDrivingLicenseNumber(@Param("drivingLicenseNumber") String drivingLicenseNumber);

    /**
     * 查询指定范围内的可用司机
     *
     * @param longitude 经度
     * @param latitude 纬度
     * @param radius 搜索半径(公里)
     * @param vehicleType 车辆类型
     * @param loadCapacity 最小载重能力
     * @return 可用司机列表
     */
    List<DriverVO> selectAvailableDriversInRange(@Param("longitude") BigDecimal longitude,
                                                @Param("latitude") BigDecimal latitude,
                                                @Param("radius") BigDecimal radius,
                                                @Param("vehicleType") String vehicleType,
                                                @Param("loadCapacity") BigDecimal loadCapacity);

    /**
     * 查询司机统计信息
     *
     * @param driverId 司机ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 统计信息
     */
    Map<String, Object> selectDriverStatistics(@Param("driverId") Long driverId,
                                              @Param("startTime") LocalDateTime startTime,
                                              @Param("endTime") LocalDateTime endTime);

    /**
     * 更新司机位置信息
     *
     * @param driverId 司机ID
     * @param longitude 经度
     * @param latitude 纬度
     * @param address 地址
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateDriverLocation(@Param("driverId") Long driverId,
                            @Param("longitude") BigDecimal longitude,
                            @Param("latitude") BigDecimal latitude,
                            @Param("address") String address,
                            @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新司机状态
     *
     * @param driverId 司机ID
     * @param driverStatus 司机状态
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateDriverStatus(@Param("driverId") Long driverId,
                          @Param("driverStatus") Integer driverStatus,
                          @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新司机在线状态
     *
     * @param driverId 司机ID
     * @param isOnline 是否在线
     * @param lastOnlineTime 最后在线时间
     * @return 更新行数
     */
    int updateDriverOnlineStatus(@Param("driverId") Long driverId,
                                @Param("isOnline") Boolean isOnline,
                                @Param("lastOnlineTime") LocalDateTime lastOnlineTime);

    /**
     * 更新司机认证状态
     *
     * @param driverId 司机ID
     * @param certificationStatus 认证状态
     * @param certificationTime 认证时间
     * @param certificationRemark 认证备注
     * @return 更新行数
     */
    int updateCertificationStatus(@Param("driverId") Long driverId,
                                 @Param("certificationStatus") Integer certificationStatus,
                                 @Param("certificationTime") LocalDateTime certificationTime,
                                 @Param("certificationRemark") String certificationRemark);

    /**
     * 批量更新司机状态
     *
     * @param driverIds 司机ID列表
     * @param driverStatus 司机状态
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int batchUpdateDriverStatus(@Param("driverIds") List<Long> driverIds,
                               @Param("driverStatus") Integer driverStatus,
                               @Param("updateTime") LocalDateTime updateTime);

    /**
     * 查询司机评分统计
     *
     * @param driverId 司机ID
     * @return 评分统计信息
     */
    Map<String, Object> selectDriverRatingStatistics(@Param("driverId") Long driverId);

    /**
     * 查询司机订单统计
     *
     * @param driverId 司机ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 订单统计信息
     */
    Map<String, Object> selectDriverOrderStatistics(@Param("driverId") Long driverId,
                                                   @Param("startTime") LocalDateTime startTime,
                                                   @Param("endTime") LocalDateTime endTime);

    /**
     * 查询司机收入统计
     *
     * @param driverId 司机ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 收入统计信息
     */
    Map<String, Object> selectDriverIncomeStatistics(@Param("driverId") Long driverId,
                                                    @Param("startTime") LocalDateTime startTime,
                                                    @Param("endTime") LocalDateTime endTime);

    /**
     * 查询司机工作时长统计
     *
     * @param driverId 司机ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 工作时长统计信息
     */
    Map<String, Object> selectDriverWorkTimeStatistics(@Param("driverId") Long driverId,
                                                      @Param("startTime") LocalDateTime startTime,
                                                      @Param("endTime") LocalDateTime endTime);

    /**
     * 查询司机里程统计
     *
     * @param driverId 司机ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 里程统计信息
     */
    Map<String, Object> selectDriverMileageStatistics(@Param("driverId") Long driverId,
                                                     @Param("startTime") LocalDateTime startTime,
                                                     @Param("endTime") LocalDateTime endTime);

    /**
     * 查询热门司机排行榜
     *
     * @param limit 查询数量限制
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 司机排行榜
     */
    List<Map<String, Object>> selectTopDrivers(@Param("limit") Integer limit,
                                              @Param("startTime") LocalDateTime startTime,
                                              @Param("endTime") LocalDateTime endTime);

    /**
     * 查询司机分布统计
     *
     * @return 司机分布统计信息
     */
    List<Map<String, Object>> selectDriverDistributionStatistics();

    /**
     * 查询司机年龄分布统计
     *
     * @return 司机年龄分布统计信息
     */
    List<Map<String, Object>> selectDriverAgeDistributionStatistics();

    /**
     * 查询司机车辆类型分布统计
     *
     * @return 司机车辆类型分布统计信息
     */
    List<Map<String, Object>> selectDriverVehicleTypeDistributionStatistics();

    /**
     * 软删除司机信息
     *
     * @param driverId 司机ID
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int softDeleteDriver(@Param("driverId") Long driverId,
                        @Param("updateTime") LocalDateTime updateTime);

    /**
     * 批量软删除司机信息
     *
     * @param driverIds 司机ID列表
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int batchSoftDeleteDrivers(@Param("driverIds") List<Long> driverIds,
                              @Param("updateTime") LocalDateTime updateTime);

    /**
     * 恢复已删除的司机信息
     *
     * @param driverId 司机ID
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int restoreDriver(@Param("driverId") Long driverId,
                     @Param("updateTime") LocalDateTime updateTime);

    /**
     * 查询司机登录日志
     *
     * @param driverId 司机ID
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @param limit 查询数量限制
     * @return 登录日志列表
     */
    List<Map<String, Object>> selectDriverLoginLogs(@Param("driverId") Long driverId,
                                                   @Param("startTime") LocalDateTime startTime,
                                                   @Param("endTime") LocalDateTime endTime,
                                                   @Param("limit") Integer limit);
}